} GrabNotifyInfo;
static void
-synth_crossing_for_grab_notify (GtkWidget *from,
- GtkWidget *to,
- GrabNotifyInfo *info,
- GList *devices,
- GdkCrossingMode mode)
+synth_crossing_for_grab_notify (GtkWidget *from,
+ GtkWidget *to,
+ GrabNotifyInfo *info,
+ GdkDevice **devices,
+ guint n_devices,
+ GdkCrossingMode mode)
{
- while (devices)
+ guint i;
+
+ for (i = 0; i < n_devices; i++)
{
- GdkDevice *device = devices->data;
+ GdkDevice *device = devices[i];
GdkSurface *from_surface, *to_surface;
/* Do not propagate events more than once to
if (to_surface)
info->notified_surfaces = g_list_prepend (info->notified_surfaces, to_surface);
}
-
- devices = devices->next;
}
}
{
GrabNotifyInfo *info = data;
gboolean was_grabbed, is_grabbed, was_shadowed, is_shadowed;
- GList *devices;
+ GdkDevice **devices;
+ guint n_devices;
was_grabbed = info->was_grabbed;
is_grabbed = info->is_grabbed;
_gtk_widget_get_device_surface (child, info->device))
{
/* Device specified and is on widget */
- devices = g_list_prepend (NULL, info->device);
+ devices = g_new (GdkDevice *, 1);
+ devices[0] = info->device;
+ n_devices = 1;
}
else
- devices = _gtk_widget_list_devices (child);
+ devices = _gtk_widget_list_devices (child, &n_devices);
if (is_shadowed)
{
if (!was_shadowed && devices &&
gtk_widget_is_sensitive (child))
synth_crossing_for_grab_notify (child, info->new_grab_widget,
- info, devices,
+ info, devices, n_devices,
GDK_CROSSING_GTK_GRAB);
}
else
if (was_shadowed && devices &&
gtk_widget_is_sensitive (child))
synth_crossing_for_grab_notify (info->old_grab_widget, child,
- info, devices,
+ info, devices, n_devices,
info->from_grab ? GDK_CROSSING_GTK_GRAB :
GDK_CROSSING_GTK_UNGRAB);
}
_gtk_widget_grab_notify (child, was_shadowed);
g_object_unref (child);
- g_list_free (devices);
+ g_free (devices);
info->was_grabbed = was_grabbed;
info->is_grabbed = is_grabbed;
*
* Returns the list of pointer #GdkDevices that are currently
* on top of any surface belonging to @widget. Free the list
- * with g_list_free(), the elements are owned by GTK+ and must
+ * with g_free(), the elements are owned by GTK+ and must
* not be freed.
*/
-GList *
-_gtk_widget_list_devices (GtkWidget *widget)
+GdkDevice **
+_gtk_widget_list_devices (GtkWidget *widget,
+ guint *out_n_devices)
{
+ GPtrArray *result;
GdkSeat *seat;
- GList *result = NULL;
GList *devices;
GList *l;
GdkDevice *device;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+ g_assert (out_n_devices);
if (!_gtk_widget_get_mapped (widget))
- return NULL;
+ {
+ *out_n_devices = 0;
+ return NULL;
+ }
+ result = g_ptr_array_new ();
seat = gdk_display_get_default_seat (_gtk_widget_get_display (widget));
device = gdk_seat_get_pointer (seat);
if (is_my_surface (widget, gdk_device_get_last_event_surface (device)))
- result = g_list_prepend (result, device);
+ {
+ g_ptr_array_add (result, device);
+ }
devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_ALL_POINTING);
for (l = devices; l; l = l->next)
{
device = l->data;
if (is_my_surface (widget, gdk_device_get_last_event_surface (device)))
- result = g_list_prepend (result, device);
+ g_ptr_array_add (result, device);
}
g_list_free (devices);
- return result;
+ *out_n_devices = result->len;
+ return (GdkDevice **)g_ptr_array_free (result, FALSE);
}
/*
if (!priv->shadowed &&
(new_flags & GTK_STATE_FLAG_INSENSITIVE) != (old_flags & GTK_STATE_FLAG_INSENSITIVE))
{
+ guint i, n_devices;
+ GdkDevice **devices;
GList *event_surfaces = NULL;
- GList *devices, *d;
- devices = _gtk_widget_list_devices (widget);
+ devices = _gtk_widget_list_devices (widget, &n_devices);
- for (d = devices; d; d = d->next)
+ for (i = 0; i < n_devices; i++)
{
GdkSurface *surface;
GdkDevice *device;
- device = d->data;
+ device = devices[i];
surface = _gtk_widget_get_device_surface (widget, device);
/* Do not propagate more than once to the
continue;
if (!gtk_widget_is_sensitive (widget))
- _gtk_widget_synthesize_crossing (widget, NULL, d->data,
+ _gtk_widget_synthesize_crossing (widget, NULL, device,
GDK_CROSSING_STATE_CHANGED);
else
- _gtk_widget_synthesize_crossing (NULL, widget, d->data,
+ _gtk_widget_synthesize_crossing (NULL, widget, device,
GDK_CROSSING_STATE_CHANGED);
event_surfaces = g_list_prepend (event_surfaces, surface);
}
g_list_free (event_surfaces);
- g_list_free (devices);
+ g_free (devices);
}
if (!gtk_widget_is_sensitive (widget))